perm filename KLLOAD[KL,SYS] blob sn#210155 filedate 1976-04-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00003 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE	KLLOAD	LOAD A PROGRAM FOR THE KL10 INTO PHYSICAL 1400000
C00005 00003	GETNAM, GETSIX
C00010 ENDMK
C⊗;
	TITLE	KLLOAD	LOAD A PROGRAM FOR THE KL10 INTO PHYSICAL 1400000

FL←0
A←1
B←2
C←3
D←4

R←16
P←17

PDLEN←←100
PDLIST:	BLOCK	PDLEN


FILDEV←←0
FILNAM←←1
FILEXT←←2
FILPPN←←4

QUOTE←←400
BLNKSN←←1000

INNAM:	'DSK   '
	'DDT   '
	'DMP   '
	0
	' KLSYS'

CRLF:	BYTE(7)15,12
LSTCHR:	0

NOCORE:	OUTSTR	[ASCIZ/CORE uuo failed.
/]
	JRST	ERROR

NOHI:	OUTSTR	[ASCIZ/GETHI failed.
/]
	JRST	ERROR

NOLOOK:	OUTSTR	[ASCIZ/Lookup failed: /]
	MOVEI	R,INNAM
	PUSHJ	P,TYFILE
	OUTSTR	CRLF
	JRST	ERROR

NOOPEN:	OUTSTR	[ASCIZ/Device /]
	MOVE	B,INNAM
	PUSHJ	P,TYSIX
	OUTSTR	[ASCIZ/: unavailable.
/]
ERROR:	CLRBFI
	RESET
	JRST	ST1

ST:	RESET
	OUTSTR	[ASCIZ/KLLOAD.
Be sure physical address 1400000 is available and online to the KA10.
If it isn't you'll hang the system.  If you need to change the memory
configuration, stop the KA10 first.
/]

ST1:	MOVE	P,[IOWD PDLEN,PDLIST]
	OUTSTR	[ASCIZ/Type name of the DMP file to load:  /]
	MOVEI	R,INNAM
	PUSHJ	P,GETNAM
	JRST	ERROR
	MOVSI	A,'DMP'			;DEFAULT EXTENSION
	SKIPN	FILEXT(R)
	MOVEM	A,FILEXT(R)		;STORE DEFAULT EXT.
	HLLZS	FILEXT(R)		;LEFT HALF ONLY.
	MOVEI	A,17
	MOVE	B,INNAM
	MOVEI	C,0
	OPEN	0,A
	JRST	NOOPEN
	MOVE	D,[INNAM+1,,A]
	BLT	D,D
	LOOKUP	0,A
	JRST	NOLOOK
	HLRO	A,D		;A←-WC OF FILE
	SUB	A,JOBFF
	MOVN	A,A
	CORE	A,		;REQUEST ENOUGH CORE
	JRST	NOCORE
	HLLZ	A,D
	HRR	A,JOBFF↑
	SUBI	A,1
	MOVEI	B,0
	INPUT	0,A
	CLOSE	0,

BREAK:	MOVE	0,[400,,1400*40+20]	;ATTACH PHYSICAL HIGH CORE AS UPPER SEGMENT
	GETHI	0,
	JRST	NOHI
	SETZM	400000
	MOVE	A,[400000,,400001]
	BLT	A,-1		;ZERO CORE
	HRL	A,JOBFF
	HRRI	A,400074
	HLRO	B,D
	SUBI	B,400074
	MOVN	B,B
	BLT	A,-1(B)
	MOVEI	A,377777
	MOVEM	A,400037
	MOVE	A,400116
	MOVEM	A,400036
	OUTSTR	[ASCIZ/Done.
Reconfigure memory.  Be sure to stop the KA10 while you diddle port selects.
/]
	EXIT	1,
	JRST	ST

;GETNAM, GETSIX

GETNAM:	SETZM	(R)
	MOVSI	A,(R)
	HRRI	A,1(R)
	BLT	A,FILPPN(R)
	MOVSI	A,'DSK'
	MOVEM	A,FILDEV(R)
	PUSHJ	P,GETSIX
	POPJ	P,			;ERROR OF SOME KIND
	CAIE	A,":"			;IS THIS A DEVICE NAME?
	JRST	GETNM1			;NO.  MUST BE A FILE NAME
	MOVEM	B,FILDEV(R)		;STORE DEVICE NAME
	PUSHJ	P,GETSIX		;GET FILE NAME
	POPJ	P,			;ERROR
GETNM1:	MOVEM	B,FILNAM(R)
	CAIE	A,"."			;EXTENSION NEXT?
	JRST	GETNM2			;NO.  CHECK FOR PPN.
	PUSHJ	P,GETSIX
	POPJ	P,
	TRNE	B,-1			;ONLY 3 LETTERS ALLOWED IN EXTENSION.
	JRST	ERR03
	HLLOM	B,FILEXT(R)		;STORE EXT.  FLAG AS EXPLICIT EXT.
GETNM2:	CAIE	A,"["
	JRST	GETNM7			;NO PPN.
	PUSHJ	P,GETSIX		;GET PROG NAME.
	POPJ	P,
	TRNE	B,-1
	JRST	ERR04
	JUMPE	B,ERR04
	CAIE	A,","
	JRST	ERR04
	TRNE	B,-1
	JRST	ERR04
	JUMPE	B,ERR04
GETNM3:	TLNE	B,77
	JRST	GETNM4
	LSH	B,-6
	JRST	GETNM3

GETNM4:	HLLZM	B,FILPPN(R)
	PUSHJ	P,GETSIX
	POPJ	P,
	TRNE	B,-1
	JRST	ERR04
	JUMPE	B,ERR04
GETNM5:	TLNE	B,77
	JRST	GETNM6
	LSH	B,-6
	JRST	GETNM5
GETNM6:	HLRM	B,FILPPN(R)
	CAIE	A,"]"
	JRST	GETNM7
	PUSHJ	P,GETSIX
	POPJ	P,
	JUMPN	B,ERR05			;NOT NULL FOLLOWING ]
GETNM7:	CAIE	A,12
	CAIN	A,"←"
	JRST	CPOPJ1
	JRST	ERR05

GETSIX:	MOVE	C,[POINT 6,B]
	MOVEI	B,0
	TRZ	FL,QUOTE!BLNKSN
GETSX1:	PUSHJ	P,GETCHR
	CAIN	A,"↓"
	JRST	[TRC	FL,QUOTE	;COMPLEMENT QUOTE
		JRST	GETSX1]
	CAIL	A,"A"+40
	CAILE	A,"Z"+40
	JRST	.+2
	SUBI	A,40			;ALWAYS CONVERT TO UPPER CASE.
	TRNE	FL,QUOTE		;IN QUOTE MODE?
	JRST	GETSX2			;YES.  SKIP VALIDITY TESTS
	CAIN	A,15
	JRST	GETSX1			;FLUSH CR.
	CAIN	A," "
	JRST	[JUMPE B,GETSX1		;FLUSH LEADING BLANKS
		TRO FL,BLNKSN		;AFTER A BLANK, MUST SEE VALID DELIMITER
		JRST GETSX1]
	CAIL	A,"A"
	CAILE	A,"Z"
	JRST	.+2
	JRST	GETSX2			;ACCEPT CHARACTER
	CAIL	A,"0"
	CAILE	A,"9"
	JRST	.+2
	JRST	GETSX2
	CAIE	A,"$"
	JRST	CPOPJ1			;THIS IS A DELIMITER!
GETSX2:	SUBI	A,40
	TRNE	FL,BLNKSN
	JRST	ERR06
	JUMPL	A,ERR06			;ILLEGAL
	TLNE	C,770000		;SKIP IF "B" IS FULL ALREADY
	IDPB	A,C			;STUFF ANOTHER BYTE IN B
	JRST	GETSX1			;LOOP

CPOPJ1:	AOS	(P)
CPOPJ:	POPJ	P,

TYSIX:	JUMPE	B,CPOPJ
	MOVEI	A,0
	LSHC	A,6
	ADDI	A,40
	OUTCHR	A
	JRST	TYSIX

TYFILE:	MOVE	B,FILDEV(R)
	CAMN	B,['DSK   ']
	JRST	TYFIL1
	PUSHJ	P,TYSIX
	OUTCHR	[":"]
TYFIL1:	SKIPN	B,FILNAM(R)
	POPJ	P,
	PUSHJ	P,TYSIX
	HLLZ	B,FILEXT(R)
	JUMPE	B,TYFIL2
	OUTCHR	["."]
	PUSHJ	P,TYSIX
TYFIL2:	SKIPN	B,FILPPN(R)
	POPJ	P,
	OUTCHR	["["]
	HLLZ	B,B
	PUSHJ	P,TYSIX
	OUTCHR	[","]
	HRLZ	B,FILPPN(R)
	PUSHJ	P,TYSIX
	OUTCHR	["]"]
	POPJ	P,


ERR03:	OUTSTR	[ASCIZ/Error in file extension.
/]
	POPJ	P,

ERR04:	OUTSTR	[ASCIZ/Error in PPN
/]
	POPJ	P,

ERR05:	OUTSTR	[ASCIZ/Error at end of a term.
/]
	POPJ	P,

ERR06:	OUTSTR	[ASCIZ/Error in term
/]
	POPJ	P,

GETCHR:	INCHWL	A
	MOVEM	A,LSTCHR
	POPJ	P,

	END	ST